如何用Android Studio 优雅的开发System App

您所在的位置:网站首页 android 修改系统设置 如何用Android Studio 优雅的开发System App

如何用Android Studio 优雅的开发System App

2023-03-26 04:09| 来源: 网络整理| 查看: 265

毕业来到手机公司做Android,发现公司的很多同事还在使用Eclipse 进行开发Android System App

现在已经21世纪啦,大清都完了啊!Android Studio你不用?那么我现在就教你如何优雅的使用Android Studio构建系统应用程序!

首先,开发系统应用程序离不开访问framework的私有方法和接口,一般你在IDE中看到的是这样:

这红色不能忍啊

/** * @hide like {@link #startService(Intent)} but for a specific user. */ @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public abstract ComponentName startServiceAsUser(Intent service, UserHandle user);

这个隐藏API其实就在framework.jar中,Context中就有,只不过"hide"你并不能访问。

这些方法其实很多,比如很多厂商自己定义的方法,这个时候你只能盲打函数。

下面这些操作,就是让你可以在gradle中编译你的系统应用。

找到未压缩的framework.jar 文件

路径为 /android/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar. 请注意,并不是/android/out/target/product/your_target/system/framework/framework.jar.

第一个是 java库,第二个是编译完成的二进次文件,显然我们需要的是第一个。

然后把.jar文件放入你工程的lib中,在gradle的dependencies中使用provided进行引用。

这个时候你就可以访问厂商定义的一些私有的类了

但这时候你并不能访问那些隐藏的方法!

因为这个时候你IDE中链接到的还只是本地SDK中的android.jar,并不是你需要的framework.jar。

所以你可能sync的时候没有问题,一旦build立马boom。

因此,我们在Android SDK放置框架之前部署我们需要的framework.jar。

这个时候我们需要为Android Gradle插件添加一个钩子,-Xbooclasspath / p:在 bootstarp classpath 之前添加classpath,像下面这样:

allprojects { repositories { jcenter() google() } gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:systemjar/framework.jar') } } }

最后,你如果需要在Android Studio里运行,还需要在app/app.iml中,把jdk的顺序调整到最后。

如果让gradle自动排序到最后,可以参考以下的task,运行task之后帮你修改sdk的order

task pushDownJdkDependency { def imlFile = file("OPSafe.iml") println 'Change OPSafe.iml order' try { def parsedXml = (new XmlParser()).parse(imlFile) def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } parsedXml.component[1].remove(jdkNode) new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': "Android API 26 Platform", 'jdkType': 'Android SDK']) def writer = new StringWriter() new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml) imlFile.text = writer.toString() } catch (FileNotFoundException e) { // nop, iml not found } }

结束,请发给我一朵小红花!!!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3